#Ana Loureiro 104063

import numpy as np
import matplotlib.pyplot as plt


def regressao_linear(x,y):

    n = len(x)

    #somas
    sumX = sum(x)
    sumY = sum(y)

    sumX2 = sum(x**2)
    sumY2 = sum(y**2)
    sumXY = sum(x * y)

    #m , b, r2
    m = (n * sumXY - sumX * sumY) / (n * sumX2 - sumX**2)
    b = (sumX2 * sumY - sumX * sumXY) / (n * sumX2 - sumX**2)
    r2 = (n * sumXY - sumX * sumY)**2 / ((n * sumX2 - sumX**2) * (n * sumY2 - sumY**2))

    #incertezas
    dM = abs(m) * np.sqrt(((1 / r2) - 1) / (n - 2))
    dB = dM * np.sqrt(sumX2 / n)

    return m, b, r2, dM, dB



def grafico_reta(m, b, x, y, title):
    plt.plot(x, y, 'ro')
    plt.plot(x, m*x + b)
    plt.xlabel('Comprimento do Fêmur (cm)')
    plt.ylabel('Massa (kg)')
    plt.title(title)
    plt.grid()
    plt.show()



def main():	

    C = np.array([1.2, 4.2, 11, 20, 22, 37, 45]) #(X)
    M = np.array([0.03, 0.54, 9.1, 38, 57, 230, 480]) #(Y)


    #a reta 𝑦 = 𝑚𝑥 + 𝑏 no gráfico e coeficiente de determinacao 
    print("a)")

    m, b, r2, dM, dB= regressao_linear(C, M)
    grafico_reta(m, b, C, M, "Ajuste Linear")
    print(f"r² = {r2:.8f}")
  


    #b1 lei exponencial ln(A)=ln(A0)−λt
    print("\nb1)")

    logM = np.log(M)
    m, b, r2, dM, dB = regressao_linear(C, logM)
    grafico_reta(m, b, C, logM, "Ajuste linear (lei exponencial)")

    print(f"m: {m:.4f}")
    print(f"Δm: {dM:.4f}")
    print(f"Coeficiente de determinação r² = {r2:.5f}")
 


    #b2 lei da potencia log(M) = log(c) + n·log(C)
    print("\nb2)")
    logC = np.log(C)
    logM = np.log(M)
    
    m, b, r2, dM, dB = regressao_linear(logC, logM)
    grafico_reta(m, b, logC, logM, "Ajuste linear (lei da potencia)")
    c = 10 ** b 


    print(f"m: {m:.4f}")
    print(f"Δm: {dM:.4f}")
    print(f"Coeficiente de determinação r² = {r2:.5f}")

    #c)
    print("\nc)")
    #Pelos resultados das alineas anteriores, conclui-se que a relação entre a massa e o comprimento do fêmur segue a lei da potência, 
    #sendo que o coeficiente de determinação desse grafico foi o que se encontrou mais próximo de 1.
    print(f"A equação (log-log) que descreve a relação é a seguinte:  log(M) = {m:.4f} * log(T) + log({c:.4f})")


if __name__ == "__main__":
    main()